home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / Mesa-3.0 / SRC-GLUT / GLUT_GET.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-07-10  |  6.0 KB  |  216 lines

  1.  
  2. /* Copyright (c) Mark J. Kilgard, 1994, 1997. */
  3.  
  4. /* This program is freely distributable without licensing fees
  5.    and is provided without guarantee or warrantee expressed or
  6.    implied. This program is -not- in the public domain. */
  7.  
  8. #include <assert.h>
  9. #include "glutint.h"
  10.  
  11. /* CENTRY */
  12. int APIENTRY 
  13. glutGet(GLenum param)
  14. {
  15.   Window win, root;
  16.   int x, y, value;
  17.   unsigned int width, height, border, depth;
  18.  
  19.   switch (param) {
  20.   case GLUT_INIT_WINDOW_X:
  21.     return __glutInitX;
  22.   case GLUT_INIT_WINDOW_Y:
  23.     return __glutInitY;
  24.   case GLUT_INIT_WINDOW_WIDTH:
  25.     return __glutInitWidth;
  26.   case GLUT_INIT_WINDOW_HEIGHT:
  27.     return __glutInitHeight;
  28.   case GLUT_INIT_DISPLAY_MODE:
  29.     return __glutDisplayMode;
  30.   case GLUT_WINDOW_X:
  31.     XTranslateCoordinates(__glutDisplay, __glutCurrentWindow->win,
  32.       __glutRoot, 0, 0, &x, &y, &win);
  33.     return x;
  34.   case GLUT_WINDOW_Y:
  35.     XTranslateCoordinates(__glutDisplay, __glutCurrentWindow->win,
  36.       __glutRoot, 0, 0, &x, &y, &win);
  37.     return y;
  38.   case GLUT_WINDOW_WIDTH:
  39.     if (!__glutCurrentWindow->reshape) {
  40.       XGetGeometry(__glutDisplay, __glutCurrentWindow->win,
  41.         &root, &x, &y,
  42.         &width, &height, &border, &depth);
  43.       return width;
  44.     }
  45.     return __glutCurrentWindow->width;
  46.   case GLUT_WINDOW_HEIGHT:
  47.     if (!__glutCurrentWindow->reshape) {
  48.       XGetGeometry(__glutDisplay, __glutCurrentWindow->win,
  49.         &root, &x, &y,
  50.         &width, &height, &border, &depth);
  51.       return height;
  52.     }
  53.     return __glutCurrentWindow->height;
  54.  
  55. #define GET_CONFIG(attrib) { \
  56.   if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) { \
  57.     glXGetConfig(__glutDisplay, __glutCurrentWindow->vis, \
  58.       attrib, &value); \
  59.   } else { \
  60.     glXGetConfig(__glutDisplay, __glutCurrentWindow->overlay->vis, \
  61.       attrib, &value); \
  62.   } \
  63. }
  64.  
  65.   case GLUT_WINDOW_BUFFER_SIZE:
  66.     GET_CONFIG(GLX_BUFFER_SIZE);
  67.     return value;
  68.   case GLUT_WINDOW_STENCIL_SIZE:
  69.     GET_CONFIG(GLX_STENCIL_SIZE);
  70.     return value;
  71.   case GLUT_WINDOW_DEPTH_SIZE:
  72.     GET_CONFIG(GLX_DEPTH_SIZE);
  73.     return value;
  74.   case GLUT_WINDOW_RED_SIZE:
  75.     GET_CONFIG(GLX_RED_SIZE);
  76.     return value;
  77.   case GLUT_WINDOW_GREEN_SIZE:
  78.     GET_CONFIG(GLX_GREEN_SIZE);
  79.     return value;
  80.   case GLUT_WINDOW_BLUE_SIZE:
  81.     GET_CONFIG(GLX_BLUE_SIZE);
  82.     return value;
  83.   case GLUT_WINDOW_ALPHA_SIZE:
  84.     GET_CONFIG(GLX_ALPHA_SIZE);
  85.     return value;
  86.   case GLUT_WINDOW_ACCUM_RED_SIZE:
  87.     GET_CONFIG(GLX_ACCUM_RED_SIZE);
  88.     return value;
  89.   case GLUT_WINDOW_ACCUM_GREEN_SIZE:
  90.     GET_CONFIG(GLX_ACCUM_GREEN_SIZE);
  91.     return value;
  92.   case GLUT_WINDOW_ACCUM_BLUE_SIZE:
  93.     GET_CONFIG(GLX_ACCUM_BLUE_SIZE);
  94.     return value;
  95.   case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
  96.     GET_CONFIG(GLX_ACCUM_ALPHA_SIZE);
  97.     return value;
  98.   case GLUT_WINDOW_DOUBLEBUFFER:
  99.     GET_CONFIG(GLX_DOUBLEBUFFER);
  100.     return value;
  101.   case GLUT_WINDOW_RGBA:
  102.     GET_CONFIG(GLX_RGBA);
  103.     return value;
  104.   case GLUT_WINDOW_COLORMAP_SIZE:
  105.     GET_CONFIG(GLX_RGBA);
  106.     if (value) {
  107.       return 0;
  108.     } else {
  109. #if defined(_WIN32)
  110.       /* KLUDGE: we always assume 256 colors in CI mode on
  111.          Win32 */
  112.       return 256;
  113. #else
  114.       if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) { 
  115.         return __glutCurrentWindow->vis->visual->map_entries;
  116.       } else {
  117.         return __glutCurrentWindow->overlay->vis->visual->map_entries;
  118.       }
  119. #endif /* _WIN32 */
  120.     }
  121.   case GLUT_WINDOW_PARENT:
  122.     return __glutCurrentWindow->parent ?
  123.       __glutCurrentWindow->parent->num + 1 : 0;
  124.   case GLUT_WINDOW_NUM_CHILDREN:
  125.     {
  126.       int num = 0;
  127.       GLUTwindow *children = __glutCurrentWindow->children;
  128.  
  129.       while (children) {
  130.         num++;
  131.         children = children->siblings;
  132.       }
  133.       return num;
  134.     }
  135.   case GLUT_WINDOW_NUM_SAMPLES:
  136. #if defined(GLX_VERSION_1_1) && defined(GLX_SGIS_multisample)
  137.     if (__glutIsSupportedByGLX("GLX_SGIS_multisample")) {
  138.       GET_CONFIG(GLX_SAMPLES_SGIS);
  139.       return value;
  140.     } else {
  141.       return 0;
  142.     }
  143. #else
  144.     /* Independent of GLX server support, multisampling not
  145.        supported by GLX client-side. */
  146.     return 0;
  147. #endif
  148.   case GLUT_WINDOW_STEREO:
  149.     GET_CONFIG(GLX_STEREO);
  150.     return value;
  151.   case GLUT_WINDOW_CURSOR:
  152.     return __glutCurrentWindow->cursor;
  153.   case GLUT_SCREEN_WIDTH:
  154.     return DisplayWidth(__glutDisplay, __glutScreen);
  155.   case GLUT_SCREEN_HEIGHT:
  156.     return DisplayHeight(__glutDisplay, __glutScreen);
  157.   case GLUT_SCREEN_WIDTH_MM:
  158.     return DisplayWidthMM(__glutDisplay, __glutScreen);
  159.   case GLUT_SCREEN_HEIGHT_MM:
  160.     return DisplayHeightMM(__glutDisplay, __glutScreen);
  161.   case GLUT_MENU_NUM_ITEMS:
  162.     return __glutCurrentMenu->num;
  163.   case GLUT_DISPLAY_MODE_POSSIBLE:
  164.     {
  165.       XVisualInfo *vi;
  166.       Bool dummy, visAlloced;
  167.       void *fbc;
  168.  
  169. #if defined(_WIN32)      
  170.       /* Our fake glXChooseVisual (which is called by
  171.          __glutDetermineVisual) needs an HDC to work with, so grab one
  172.          from the "root" window. */
  173.       XHDC = GetDC(GetDesktopWindow());
  174. #endif
  175.       vi = __glutDetermineWindowVisual(&dummy, &visAlloced, &fbc);
  176. #if defined(_WIN32)      
  177.       ReleaseDC(GetDesktopWindow(), XHDC);
  178. #endif
  179.       if (vi) {
  180.         if (visAlloced)
  181.           XFree(vi);
  182.         return 1;
  183.       }
  184.       return 0;
  185.     }
  186.   case GLUT_ELAPSED_TIME:
  187.     {
  188.       struct timeval elapsed, beginning, now;
  189.  
  190.       __glutInitTime(&beginning);
  191.       GETTIMEOFDAY(&now);
  192.       TIMEDELTA(elapsed, now, beginning);
  193.       /* Return elapsed milliseconds. */
  194. #if defined(__vms) && ( __VMS_VER < 70000000 )
  195.       return (int) (elapsed.val / TICKS_PER_MILLISECOND);
  196. #else
  197.       return (int) ((elapsed.tv_sec * 1000) + (elapsed.tv_usec / 1000));
  198. #endif
  199.     }
  200.   case GLUT_WINDOW_FORMAT_ID:
  201. #if defined(_WIN32)
  202.     return GetPixelFormat(__glutCurrentWindow->hdc);
  203. #else
  204.     if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
  205.       return (int) __glutCurrentWindow->vis->visualid;
  206.     } else {
  207.       return (int) __glutCurrentWindow->overlay->vis->visualid;
  208.     }
  209. #endif
  210.   default:
  211.     __glutWarning("invalid glutGet parameter: %d", param);
  212.     return -1;
  213.   }
  214. }
  215. /* ENDCENTRY */
  216.